package com.mystudy.springcloud.service;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class PaymentService {
	/**
	 * @功能: 不会出问题的方法
	 */
	public String paymentInfo_OK(Integer id) {
		return "线程池：" + Thread.currentThread().getName() + " peymentInfo_OK " + id + " O(∩_∩)O ";
	}

	/**
	 * @功能: 可能会出问题的方法
	 */
	@HystrixCommand(fallbackMethod = "payment_TimeOutHandler", commandProperties = {
			@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
	})
	public String payment_TimeOut(Integer id) {
		try {
			TimeUnit.SECONDS.sleep(4);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "线程池：" + Thread.currentThread().getName() + " peyment_TimeOut " + id + " ┭┮﹏┭┮ ";
	}

	/**
	 * @功能: 可能会出问题的方法出问题后兜底的方法
	 */
	public String payment_TimeOutHandler(Integer id) {
		return "线程池：" + Thread.currentThread().getName() + " payment_TimeOutHandler " + id + " (┭┮﹏┭┮) " + "\t当前业务繁忙，请稍后再试！- 8001";
	}

	// ----------------------------服务熔断-----------------------------

	/**
	 * @功能: 服务熔断测试方法
	 */
	@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {
			@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),// 是否开启断路器
			@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数
			@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期
			@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),// 失败率达到多少后跳闸
	})
	public String paymentCircuitBreaker(Integer id) {
		if (id < 0) {
			throw new RuntimeException("id不能为负数！");
		}
		String serialNumber = IdUtil.simpleUUID();
		return Thread.currentThread().getName() + "  调用成功  流水号：" + serialNumber;
	}

	/**
	 * @功能: 服务熔断测试方法的兜底方法
	 */
	public String paymentCircuitBreaker_fallback(Integer id) {
		return "id = " + id + ",id 不能为负数 请填写正确的ID重新尝试！";
	}
}
